import type { IRequestOptions, IResponseType } from "./types";

/*
  泛型：定义类型时不先指定类型，而是在使用时指定类型
    function fn<T>(): T {} // 声明泛型参数T，函数的返回值类型使用了T
    fn<string>(); // 将函数返回值类型是string
    fn<number>(); // 将函数返回值类型是number
*/

function request<T>({ url, data, method }: IRequestOptions): Promise<T> {
  return new Promise((resolve, reject) => {
    uni.request({
      url,
      data,
      method,
      success(res) {
        // 两个场景下会使用断言：1. 联合类型 2. unknown
        const data = res.data as IResponseType<T>;
        const statusCode = res.statusCode;
        if (statusCode >= 200 && statusCode < 300) {
          if (data.code === 200) {
            resolve(data.data);
          } else {
            uni.showToast({
              title: data.message,
              icon: "error",
            });
            reject(data.message);
          }
        } else {
          uni.showToast({
            title: data.error,
            icon: "error",
          });
          reject(data.error);
        }
      },
      fail(err) {
        uni.showToast({
          title: err.errMsg,
          icon: "error",
        });
        reject(err.errMsg);
      },
    });
  });
}

export default request;

/*
  any 任意类型
  unknown 不知道类型
*/

// let a: any;
// a = 1;
// a = [];
// a = true;
// a.forEach();
// a.split();

// let b: unknown;
// b = 1;
// b = true;
// b = [];
// b = {};
// (b as []).forEach(() => {})
